package com.example.demo.utils;

import com.jcraft.jsch.*;

import java.io.*;
import java.util.Properties;

/**
 * sftp上传下载测试
 * @author wyc
 * 2020年5月18日 上午11:16:05
 */
public class SFTPUtil {
	private ChannelSftp sftp;

    private Session session;
    /** SFTP 登录用户名*/
    private String username;
    /** SFTP 登录密码*/
    private String password;
    /** 私钥 */
    private String privateKey;
    /** SFTP 服务器地址IP地址*/
    private String host;
    /** SFTP 端口*/
    private int port;

    /**
     * 构造基于密码认证的sftp对象
     * @param username 账号
     * @param password 密码
     * @param host IP地址
     * @param port 端口号
     */
    public SFTPUtil(String username, String password, String host, int port) {
        this.username = username;
        this.password = password;
        this.host = host;
        this.port = port;
    }

    /**
     * 构造基于秘钥认证的sftp对象
     */
    public SFTPUtil(String username, String host, int port, String privateKey) {
        this.username = username;
        this.host = host;
        this.port = port;
        this.privateKey = privateKey;
    }

    public SFTPUtil(){}


    /**
     * 连接sftp服务器
     */
    public void login(){
        try {
            JSch jsch = new JSch();
            if (privateKey != null) {
                jsch.addIdentity(privateKey);// 设置私钥
            }

            session = jsch.getSession(username, host, port);

            if (password != null) {
                session.setPassword(password);
            }
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");

            session.setConfig(config);
            session.connect();

            Channel channel = session.openChannel("sftp");
            channel.connect();

            sftp = (ChannelSftp) channel;
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭连接 server
     */
    public void logout(){
        if (sftp != null) {
            if (sftp.isConnected()) {
                sftp.disconnect();
            }
        }
        if (session != null) {
            if (session.isConnected()) {
                session.disconnect();
            }
        }
    }


//    /**
//     * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
//     * @param basePath  服务器的基础路径
//     * @param sftpFileName  sftp端文件名
//     * @param in   输入流
//     */
    public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{
        try {
    		sftp.cd(directory);
        } catch (SftpException e) {
        	sftp.mkdir(directory);
            sftp.cd(directory);
        }
        sftp.put(input, sftpFileName);  //上传文件
    }

//    /**
//	 * 将当前服务器指定文件上传到指定FTP服务器,并把FTP文件名设置到doc里
//	 * @param doc 文档
//	 * @param fdName 附件字段
//	 * @param interFaceName 接口字段
//	 * @param fileType 文件类型，参照接口文档
//	 * @throws SftpException
//	 * @throws IOException
//	 */
	public static String uploadFile(String fileName,String fullFile) throws SftpException, IOException{
			String ftpFileName = fileName;
            try {
                //登录ftp
                //todo 配置用户名、密码
                String ftpUser = "itok";
                String ftpPass = "Aqscy@051";
                String ftpIp = "10.252.22.250";
                Integer ftpPort = 21;//TODO 待定
                String ftpPath = "/hwjkfile2/FileTrans/bcoc/groupQAMetric/fromplatform";
                SFTPUtil ut = new SFTPUtil(ftpUser, ftpPass, ftpIp, ftpPort);
                ut.login();

                //上传
                File file = new File(fullFile);
                InputStream is = new FileInputStream(file);
                ut.upload(ftpPath, ftpFileName, is);

                //关闭资源
                is.close();
                ut.logout();
            }catch(Exception e){
                return "500";
            }
            return "200";
		}



    /**
     * 下载文件到本地目录
     * @param directory 下载目录
     * @param downloadFile 下载的文件
     * @param saveFile 存在本地的路径
     */
    public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{
        if (directory != null && !"".equals(directory)) {
            sftp.cd(directory);
            File file = new File(saveFile);
            sftp.get(downloadFile, new FileOutputStream(file));
        }
    }


    /**
     * 下载文件-流的形式
     * @param directory 下载目录
     * @param downloadFile 下载的文件
     * @return
     * @throws SftpException
     * @throws FileNotFoundException
     */
    public InputStream download(String directory, String downloadFile) throws SftpException, FileNotFoundException{
    	if (directory != null && !"".equals(directory)) {
            sftp.cd(directory);
            InputStream is = sftp.get(downloadFile);
            return is;
        }
    	return null;
    }

    /**
     * 删除文件
     * @param directory 要删除文件所在目录
     * @param deleteFile 要删除的文件
     * @throws SftpException
     * @throws Exception
     */
    public void delete(String directory, String deleteFile) throws SftpException{
        sftp.cd(directory);
        sftp.rm(deleteFile);
    }


    /**
     * 生成文件名
     * AAAA_BBBBBBByyyyMMddHHmmss_CCC.XXX
     * 其中A为文件类型， B为唯一字符UUID,yyyymMMddHHmmss为当前日期,C为省份编号，X为文件后缀
     * @param fileType 文件类型
     * @param province 省份编号
     * @param suffix 文件后缀
     * @return
     */
//    public static String generateFileName(String fileType,String province,String suffix){
//    	String date = DateUtil.formatDate(new Date(), "yyyyMMddHHmmss");
//    	String random = (int)((Math.random()*9+1)*1000000)+"";
//    	String fileName = fileType+"_"+random+date+"_"+province+suffix;
//    	return fileName;
//    }


    /**
     * @param args
     * @throws SftpException
     * @throws IOException
     */
    public static void main(String[] args) throws SftpException, IOException {
    	SFTPUtil ut=new SFTPUtil("root", "Gztemco-123456","8.129.214.206", 22);
    	ut.login();

    	//上传
//    	File file = new File("D:\\天工远科项目\\ITOK流程项目\\01需求管理\\20200427统一提数需求\\统一提数人员角色和厂商.xls");
//    	InputStream is;
//		is = new FileInputStream(file);
//		ut.upload("/data/work/temp", "aa.xls", is);

    	//下载到本地
//    	ut.download("/data/work/temp", "aa.xls", "D:\\googledownload\\a.xls");

    	//下载为流的形式
    	InputStream is = ut.download("/data/work/temp", "aa.xls");
    	File file = new File("D:\\googledownload\\c.xls");
    	FileOutputStream fos = new FileOutputStream(file);

    	byte[] b = new byte[1024];
    	int num = 0;
    	while ((num = is.read(b)) != -1) {
    	    fos.write(b,0,num);// 写入数据
    	}

    	fos.close();
    	is.close();

    	//删除
//    	ut.delete("/data/work/temp", "aa.xls");

    	ut.logout();
	}
}
